package java学习.第11章_常用类和基础API;

import org.junit.Test;

/**
 * String
 * final:String是不可继承的
 * Serializable:可序列化的，
 * 凡是实现此接口的对象就可以通过网络或本地流进行数据传输
 * Comparable<String>:凡是实现此接口的类，其对象都可以比较大小
 * <p>
 * 内部声明的属性：
 * JKD8：private final char[] value  //存储字符串的长度
 * JKD9：private final byte[] value  // 需要开启此配置   -XX:+UseCompressedStrings
 * <p>
 * 字符串存储的位置：字符串常量池中，
 * 字符串常量池中不能存在两个相同的字符
 * JKD7之前:字符串常量池存在方法区 (不GC)
 * JKD7:字符串常量池存在堆空间(字符串常用，需要经常GC)
 * String是不可变
 */

public class A_String实例化和连接操作 {


    @Test
    public void replace字符替换(){
        String s1 = "hello";
        s1.replace('e','w');//将 e 字符替换成 w
        String replace = s1.replace("e", "w");//将 e 字符串替换成 w 字符串
        s1.concat("5");//返回 这个字符串连接 相等于new
    }
    @Test
    public void new字符串(){
        //new String 相当于在堆里(不在字符串常量池，不会重用以前的) 创建一个空间
        //但是背后，他会在字符串常量池中自己在创建一个
        String s1 = new String("55");
        String s2 = new String("55");
        String s3 = "55";
        System.out.println(s1==s2);//false
        System.out.println(s1==s3);//false

    }

    @Test
    public void 字符串连接(){
        String s1="a";//加final  就相当于 这个 s1 是一个常量
        String s2="b";

        String s3 = "ab" ;//只有常量 存在字符串常量池中存储
        String s4="a"+"b";//只有常量 存在字符串常量池中存储
        String s5 =s1+"b";//有变量名字要在堆里存储   相等于new
        String s6 ="a"+s2;//有变量名字要在堆里存储   相等于new
        String s7 =s1 +s2;//有变量名字要在堆里存储   相等于new
        //存在变量 调用了StringBuilder  进行了append() 进行连接，
        // 最后执行  toString() 方法 toString()源码就是 new String()

        System.out.println(s3 == s4);//true
        System.out.println(s3 == s5);//false
        System.out.println(s5 == s6);//false
        System.out.println(s3 == s7);//false
        System.out.println(s5 == s7);//false
        System.out.println("****************************");
        String s8=s5.intern();//返回与s5相等的 字符串常量池的 String  没有在字符串常量池中造一个
        System.out.println(s3 == s5);//false
        System.out.println(s3 == s8);//ture
    }
}
